/**
 * 将字节转换为字符串
 * @param v - 字节值
 * @returns 转换后的字符串
 */
function byteToStr(v: number): string {
  return String.fromCharCode((v & 0xf) + 97, ((v >> 4) & 0xf) + 97);
}

/**
 * 将字转换为字符串
 * @param v - 字值
 * @returns 转换后的字符串
 */
function wordToStr(v: number): string {
  return byteToStr(v & 0xff) + byteToStr((v >> 8) & 0xff);
}

/**
 * 准备数据并返回字符串数组（方法A）
 * @param a - 像素数组
 * @param c - 颜色模式：-1(16位模式)、-2(4位模式)或其他(比较模式)
 * @returns 处理后的字符串数组
 */
export function prepareDataStringsA(a: number[], c: number): string[] {
  const result: string[] = [];
  let pxInd = 0;

  // 继续处理直到所有像素都被处理
  while (pxInd < a.length) {
    let rqMsg = "";

    if (c == -1) {
      // 16位模式
      while (pxInd < a.length && rqMsg.length < 1500) {
        let v = 0;
        for (let i = 0; i < 16; i += 2) {
          if (pxInd < a.length) {
            v |= a[pxInd] << i;
          }
          pxInd++;
        }
        rqMsg += wordToStr(v);
      }
    } else if (c == -2) {
      // 4位模式
      while (pxInd < a.length && rqMsg.length < 1500) {
        let v = 0;
        for (let i = 0; i < 16; i += 4) {
          if (pxInd < a.length) {
            v |= a[pxInd++] << i;
          }
        }
        rqMsg += wordToStr(v);
      }
    } else {
      // 比较模式
      while (pxInd < a.length && rqMsg.length < 1500) {
        let v = 0;
        for (let i = 0; i < 8; i++) {
          if (pxInd < a.length && a[pxInd] != c) {
            v |= 128 >> i;
          }
          pxInd++;
        }
        rqMsg += byteToStr(v);
      }
    }

    // 如果有数据，添加到结果数组
    if (rqMsg.length > 0) {
      result.push(rqMsg);
    }
  }

  return result;
}

/**
 * 准备数据并返回字符串数组
 * @param a - 像素数组
 * @param c - 比较颜色值
 * @returns 处理后的字符串数组
 */
export function prepareDataStringsB(a: number[], c: number): string[] {
  const result: string[] = [];
  let pxInd = 0;

  // 继续处理直到所有像素都被处理
  while (pxInd < a.length) {
    let rqMsg = "";

    // 每个字符串限制在1500字符以内
    while (rqMsg.length < 1500 && pxInd < a.length) {
      let x = 0;
      while (x < 122 && pxInd < a.length) {
        let v = 0;
        // 处理122个像素
        for (let i = 0; i < 8 && x < 122 && pxInd < a.length; i++, x++) {
          // 检查像素是否与比较颜色相同
          if (a[pxInd++] != c) {
            // 合并8位像素值
            v |= 128 >> i;
          }
        }
        rqMsg += byteToStr(v);
      }
    }

    // 如果有数据，添加到结果数组
    if (rqMsg.length > 0) {
      result.push(rqMsg);
    }
  }

  return result;
}

/**
 * 上传图像到电子墨水屏
 * @returns {number} - 返回0
 */
export function getUploadData(a: number[], epdInd: number): string[][] {
  // 根据不同的电子墨水屏型号(epdInd)设置不同的上传处理流程
  // 3 12 16 19 39 重复
  if (epdInd == 3 || epdInd == 39 || epdInd == 43) {
    return [prepareDataStringsB(a, 0)];
  }
  // if (epdInd == 3 || epdInd == 39 ) {
  //   return [prepareDataStringsA(a, 0)];
  // }
  if (epdInd == 40) {
    return [prepareDataStringsB(a, 0), prepareDataStringsB(a, 3)];
  }
  if (
    epdInd == 0 ||
    epdInd == 6 ||
    epdInd == 7 ||
    epdInd == 9 ||
    epdInd == 12 ||
    epdInd == 16 ||
    epdInd == 19 ||
    epdInd == 22 ||
    epdInd == 26 ||
    epdInd == 27 ||
    epdInd == 28 
  ) {
    return [prepareDataStringsA(a, 0)];
  }
  if (epdInd > 15 && epdInd < 22) {
    return [prepareDataStringsA(a, -1)];
  }
  if (epdInd == 25 || epdInd == 37) {
    return [prepareDataStringsA(a, -2)];
  }
  if (epdInd == 23) {
    return [prepareDataStringsA(a, 0), prepareDataStringsA(a, 3)];
  }
  if (epdInd == 1) {
    return [prepareDataStringsA(a, -1), prepareDataStringsA(a, 3)];
  }
  // if (epdInd == 12) {
  //   return [prepareDataStringsA(a, -1), prepareDataStringsA(a, 3)];
  // } 
  return [prepareDataStringsA(a, 0), prepareDataStringsA(a, 3)];
}
